﻿using B.S.Meeting.Domain;
using Microsoft.EntityFrameworkCore;

namespace B.S.Meeting.Infrastructure
{
    public class BaseDbContext : DbContext
    {
        public BaseDbContext(DbContextOptions options) : base(options)
        {
        }

        //用户表
        public virtual DbSet<User> Users { get; set; }
        //会议室表

        public virtual DbSet<MeetingRoom> MeetingRooms { get; set; }
        //角色表
        public virtual DbSet<Role> Roles { get; set; }
        //部门表
        public virtual DbSet<Dept> Depts { get; set; }
        //会议预约表
        public virtual DbSet<MeetingReservation> MeetingReservations { get; set; }
        //审批会议预约表
        public virtual DbSet<ApproveReservation> ApproveReservations { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {

            // 自动为所有继承自 BaseEntity 的实体加上 IsDelete == false 的全局过滤器
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
                // 判断是否继承自 BaseEntity，且不是抽象类
                if
                (typeof(Basedata).IsAssignableFrom(entityType.ClrType) && !entityType.ClrType.IsAbstract)
                {
                    //构建表达式x=>!x.IsDelete
                    //创建一个参数 x，类型为当前实体类型(如 User、Role 等)。
                    var parameter = System.Linq.Expressions.Expression.Parameter(entityType.ClrType,
                    "x");
                    //获取当前实体类型的 IsDelete 属性。
                    var property = System.Linq.Expressions.Expression.Property(parameter, nameof
                    (Basedata.IsDel));
                    //创建一个表达式，表示 IsDelete 属性等于 false。
                    var compare = System.Linq.Expressions.Expression.Equal(property,
                    System.Linq.Expressions.Expression.Constant(false));
                    //创建一个 Lambda 表达式，表示x=>!x.IsDelete。
                    var lambda = System.Linq.Expressions.Expression.Lambda(compare,
                    parameter);
                    //将这个 Lambda 表达式作为査询过滤器应用到当前实体类型上。
                    entityType.SetQueryFilter(lambda);
                }

        }

        /// <summary>
        /// 重写SaveChanges方法
        /// </summary>
        /// <returns></returns>
        public override int SaveChanges()
        {
            var entries = ChangeTracker.Entries<Basedata>();
            foreach (var entry in entries)
            {
                if (entry.State == EntityState.Added)
                {
                    entry.Entity.CreateTime = DateTime.Now;
                    entry.Entity.CreateId = 1; // TODO: 获取当前用户ID
                    entry.Entity.CreateName = "Admin"; // TODO: 获取当前用户名
                }
                else if (entry.State == EntityState.Modified)
                {
                    entry.Entity.UpdateTime = DateTime.Now;
                    entry.Entity.UpdateId = 1; // TODO: 获取当前用户ID
                    entry.Entity.UpdateName = "Admin"; // TODO: 获取当前用户名
                }
                else if (entry.State == EntityState.Deleted)
                {
                    entry.Entity.DelTime = DateTime.Now;
                    entry.Entity.DelId = 1; // TODO: 获取当前用户ID
                    entry.Entity.DelName = "Admin"; // TODO: 获取当前用户名
                    entry.Entity.IsDel = true;
                    entry.State = EntityState.Modified;
                }
            }


            return base.SaveChanges();
        }
    }
}
